package br.com.javamagazine.leilaojm.domain;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.enterprise.context.Dependent;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;

@Dependent
@Entity
public class Anuncio implements Serializable {

	private static final long serialVersionUID = -4624078179314201211L;

	@Id
	@GeneratedValue(generator = "anuncio_id_seq", strategy = GenerationType.SEQUENCE)
	@SequenceGenerator(name = "anuncio_id_seq", sequenceName = "anuncio_id_seq", allocationSize = 1)
	private Integer id;
	private String titulo;
	private String descricao;
	private Integer anoModelo;
	private Integer anoFabricacao;
	private String uf;
	private String cidade;
	private Boolean precoFixo = true;
	private Double valor;
	private Double valorLanceAtual;
	private Boolean vendido;

	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "id_modelo")
	private Modelo modelo;

	@OneToMany(mappedBy = "anuncio", fetch = FetchType.EAGER)
	private List<ImagemAnuncio> imagensAnuncio = new ArrayList<ImagemAnuncio>();

	public List<String> getImagensComoListaDeStrings() {
		List<String> imagensComoListaString = new ArrayList<String>();
		for (ImagemAnuncio img : imagensAnuncio) {
			imagensComoListaString.add(img.getNome());
		}
		return imagensComoListaString;
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getTitulo() {
		return titulo;
	}

	public void setTitulo(String titulo) {
		this.titulo = titulo;
	}

	public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	public Integer getAnoModelo() {
		return anoModelo;
	}

	public void setAnoModelo(Integer anoModelo) {
		this.anoModelo = anoModelo;
	}

	public Integer getAnoFabricacao() {
		return anoFabricacao;
	}

	public void setAnoFabricacao(Integer anoFabricacao) {
		this.anoFabricacao = anoFabricacao;
	}

	public String getUf() {
		return uf;
	}

	public void setUf(String uf) {
		this.uf = uf;
	}

	public String getCidade() {
		return cidade;
	}

	public void setCidade(String cidade) {
		this.cidade = cidade;
	}

	public Boolean getPrecoFixo() {
		return precoFixo;
	}

	public void setPrecoFixo(Boolean precoFixo) {
		this.precoFixo = precoFixo;
	}

	public Double getValor() {
		return valor;
	}

	public void setValor(Double valor) {
		this.valor = valor;
	}

	public Double getValorLanceAtual() {
		return valorLanceAtual;
	}

	public void setValorLanceAtual(Double valorLanceAtual) {
		this.valorLanceAtual = valorLanceAtual;
	}

	public Boolean getVendido() {
		return vendido;
	}

	public void setVendido(Boolean vendido) {
		this.vendido = vendido;
	}

	public Modelo getModelo() {
		return modelo;
	}

	public void setModelo(Modelo modelo) {
		this.modelo = modelo;
	}

	public List<ImagemAnuncio> getImagensAnuncio() {
		return imagensAnuncio;
	}

	public void setImagensAnuncio(List<ImagemAnuncio> imagensAnuncio) {
		this.imagensAnuncio = imagensAnuncio;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result
				+ ((anoFabricacao == null) ? 0 : anoFabricacao.hashCode());
		result = prime * result
				+ ((anoModelo == null) ? 0 : anoModelo.hashCode());
		result = prime * result + ((cidade == null) ? 0 : cidade.hashCode());
		result = prime * result
				+ ((descricao == null) ? 0 : descricao.hashCode());
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		result = prime * result + ((modelo == null) ? 0 : modelo.hashCode());
		result = prime * result
				+ ((precoFixo == null) ? 0 : precoFixo.hashCode());
		result = prime * result + ((titulo == null) ? 0 : titulo.hashCode());
		result = prime * result + ((uf == null) ? 0 : uf.hashCode());
		result = prime * result + ((valor == null) ? 0 : valor.hashCode());
		result = prime * result
				+ ((valorLanceAtual == null) ? 0 : valorLanceAtual.hashCode());
		result = prime * result + ((vendido == null) ? 0 : vendido.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Anuncio other = (Anuncio) obj;
		if (anoFabricacao == null) {
			if (other.anoFabricacao != null)
				return false;
		} else if (!anoFabricacao.equals(other.anoFabricacao))
			return false;
		if (anoModelo == null) {
			if (other.anoModelo != null)
				return false;
		} else if (!anoModelo.equals(other.anoModelo))
			return false;
		if (cidade == null) {
			if (other.cidade != null)
				return false;
		} else if (!cidade.equals(other.cidade))
			return false;
		if (descricao == null) {
			if (other.descricao != null)
				return false;
		} else if (!descricao.equals(other.descricao))
			return false;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		if (modelo == null) {
			if (other.modelo != null)
				return false;
		} else if (!modelo.equals(other.modelo))
			return false;
		if (precoFixo == null) {
			if (other.precoFixo != null)
				return false;
		} else if (!precoFixo.equals(other.precoFixo))
			return false;
		if (titulo == null) {
			if (other.titulo != null)
				return false;
		} else if (!titulo.equals(other.titulo))
			return false;
		if (uf == null) {
			if (other.uf != null)
				return false;
		} else if (!uf.equals(other.uf))
			return false;
		if (valor == null) {
			if (other.valor != null)
				return false;
		} else if (!valor.equals(other.valor))
			return false;
		if (valorLanceAtual == null) {
			if (other.valorLanceAtual != null)
				return false;
		} else if (!valorLanceAtual.equals(other.valorLanceAtual))
			return false;
		if (vendido == null) {
			if (other.vendido != null)
				return false;
		} else if (!vendido.equals(other.vendido))
			return false;
		return true;
	}

}
